package br.com.sisat.persistencia.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.sisat.modelo.EspecialidadeDTO;
import br.com.sisat.modelo.RelatorioTempoEsperaDTO;
import br.com.sisat.modelo.TerapeutaDTO;
import br.com.sisat.persistencia.conexao.ConnectionProvider;
import br.com.sisat.util.ObjectUtil;
import br.com.sisat.util.UtilDatas;

public class RelatorioTempoEsperaDAO {

	private static RelatorioTempoEsperaDAO dao;
	
	public static RelatorioTempoEsperaDAO getInstance(){
		if(ObjectUtil.isEmpty(dao)){
			dao = new RelatorioTempoEsperaDAO();
		}
		return dao;
	}
	
	
	public List<EspecialidadeDTO> recuperarEspecialidades() throws Exception {
		List<EspecialidadeDTO> especialidades = new ArrayList<EspecialidadeDTO>();
		String sql = " SELECT id_especialidade, nome FROM sat.especialidade order by id_especialidade;";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			EspecialidadeDTO especialidade = new EspecialidadeDTO();
			especialidade.setIdEspecialidade(rs.getLong("id_especialidade"));
			especialidade.setNoEspecialidade(rs.getString("nome"));
			especialidades.add(especialidade);
		}
		conn.close();
		return especialidades;
	}

	public List<TerapeutaDTO> recuperarTerapeutas() throws Exception {
		List<TerapeutaDTO> terapeutas = new ArrayList<TerapeutaDTO>();
		String sql = " SELECT terapeuta.id_pessoa, pessoa.nome" +
					 " FROM sat.terapeuta terapeuta" +
					 " join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa) order by terapeuta.id_pessoa;";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			TerapeutaDTO terapeuta = new TerapeutaDTO();
			terapeuta.setIdTerapeuta(rs.getLong("id_pessoa"));
			terapeuta.setNoTerapeuta(rs.getString("nome"));
			terapeutas.add(terapeuta);
		}
		conn.close();
		return terapeutas;
	}


	public List<RelatorioTempoEsperaDTO> recuperaTempoDia(RelatorioTempoEsperaDTO relTempoEsperaDTO) throws Exception {
		List<RelatorioTempoEsperaDTO> lista = new ArrayList<RelatorioTempoEsperaDTO>();
		String sql = "select date_part('dow', consulta.data) as dia, " +
				     "SUM( (cast( cast(SUBSTRING(fim, 1, 2) as text) as integer) " +
				     "- cast( cast(SUBSTRING(inicio, 1, 2) as text) as integer))) AS tempoTotal, " +
				     "count(*) quantidade " +
				     "FROM sat.consulta consulta " +
				     "join sat.pessoa pessoa on (consulta.id_pessoa = pessoa.id_pessoa) " +
				     "join sat.terapeuta terapeuta on (consulta.id_terapeuta = terapeuta.id_terapeuta) " +
				     "join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
				     "where consulta.fim is not null ";
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getDataInicio())){
			sql = sql + " and (consulta.data > '" + UtilDatas.strToSQLDate(relTempoEsperaDTO.getDataInicio()).toString()+" ')"; 
					 
		}
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getDataInicio())){
			sql = sql + "' and consulta.data < '" + UtilDatas.strToSQLDate(relTempoEsperaDTO.getDataFim()).toString() +" ')";
		}
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNuEspecialidade()) && relTempoEsperaDTO.getNuEspecialidade() != 0){
			sql =  sql + " and especialidade.id_especialidade = " + relTempoEsperaDTO.getNuEspecialidade().toString();
		}
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNuTerapeuta()) && relTempoEsperaDTO.getNuTerapeuta() != 0){
			sql =  sql + " and terapeuta.id_terapeuta = " + relTempoEsperaDTO.getNuTerapeuta().toString();
		}
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNoPaciente())){
			sql =  sql + " and pessoa.nome = '" + relTempoEsperaDTO.getNoPaciente() + "'";
		}
		sql = sql +  " group by data";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			RelatorioTempoEsperaDTO tempo = new RelatorioTempoEsperaDTO();
			tempo.setNuDia(rs.getLong("dia"));
			tempo.setTempoTotal(rs.getBigDecimal("tempoTotal"));
			tempo.setQuantidade(rs.getBigDecimal("quantidade"));
			lista.add(tempo);
		}
		conn.close();
		return lista;
	}


	public List<RelatorioTempoEsperaDTO> recuperaTempoEspecialidade(RelatorioTempoEsperaDTO relTempoEsperaDTO) throws Exception {
			List<RelatorioTempoEsperaDTO> lista = new ArrayList<RelatorioTempoEsperaDTO>();
			String sql = "select especialidade.nome, " +
				     "SUM( (cast( cast(SUBSTRING(fim, 1, 2) as text) as integer) " +
				     "- cast( cast(SUBSTRING(inicio, 1, 2) as text) as integer))) AS tempoTotal, " +
				     "count(*) quantidade " +
				     "FROM sat.consulta consulta " +
				     "join sat.pessoa pessoa on (consulta.id_pessoa = pessoa.id_pessoa) " +
				     "join sat.terapeuta terapeuta on (consulta.id_terapeuta = terapeuta.id_terapeuta) " +
				     "join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
				     "where consulta.fim is not null ";
			if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getDataInicio())){
			sql = sql + " and (consulta.data > '" + UtilDatas.strToSQLDate(relTempoEsperaDTO.getDataInicio()).toString()+" ')"; 
					 
			}
			if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getDataInicio())){
			sql = sql + "' and consulta.data < '" + UtilDatas.strToSQLDate(relTempoEsperaDTO.getDataFim()).toString() +" ')";
			}
			if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNuEspecialidade()) && relTempoEsperaDTO.getNuEspecialidade() != 0){
			sql =  sql + " and especialidade.id_especialidade = " + relTempoEsperaDTO.getNuEspecialidade().toString();
			}
			if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNuTerapeuta()) && relTempoEsperaDTO.getNuTerapeuta() != 0){
			sql =  sql + " and terapeuta.id_terapeuta = " + relTempoEsperaDTO.getNuTerapeuta().toString();
			}
			if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNoPaciente())){
			sql =  sql + " and pessoa.nome = '" + relTempoEsperaDTO.getNoPaciente() + "'";
			}
			sql = sql +  " group by especialidade.nome";
			Connection conn = ConnectionProvider.getDefaultConnection();
			PreparedStatement ps = conn.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			while(rs.next()){
			RelatorioTempoEsperaDTO tempo = new RelatorioTempoEsperaDTO();
			tempo.setNoEspecialidade(rs.getString("nome"));
			tempo.setTempoTotal(rs.getBigDecimal("tempoTotal"));
			tempo.setQuantidade(rs.getBigDecimal("quantidade"));
			lista.add(tempo);
			}
			conn.close();
			return lista;
	}


	public List<RelatorioTempoEsperaDTO> recuperaTempoTerapeuta(RelatorioTempoEsperaDTO relTempoEsperaDTO) throws Exception {
		List<RelatorioTempoEsperaDTO> lista = new ArrayList<RelatorioTempoEsperaDTO>();
		String sql = "SELECT (SELECT pessoa.nome FROM sat.terapeuta terapeuta " +
				     "join sat.pessoa pessoa on (terapeuta.id_pessoa = pessoa.id_pessoa)) as nome, " +
				     "SUM( (cast( cast(SUBSTRING(fim, 1, 2) as text) as integer) " +
				     "- cast( cast(SUBSTRING(inicio, 1, 2) as text) as integer))) AS tempoTotal, " +
				     "count(*) quantidade " +
				     "FROM sat.consulta consulta " +
				     "join sat.pessoa pessoa on (consulta.id_pessoa = pessoa.id_pessoa) " +
				     "join sat.terapeuta terapeuta on (consulta.id_terapeuta = terapeuta.id_terapeuta) " +
				     "join sat.especialidade especialidade on (terapeuta.id_especialidade = especialidade.id_especialidade) " +
				     "where consulta.fim is not null ";
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getDataInicio())){
		sql = sql + "' and (consulta.data > '" + UtilDatas.strToSQLDate(relTempoEsperaDTO.getDataInicio()).toString()+" ')"; 
				 
		}
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getDataInicio())){
		sql = sql + "' and consulta.data < '" + UtilDatas.strToSQLDate(relTempoEsperaDTO.getDataFim()).toString() +" ')";
		}
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNuEspecialidade()) && relTempoEsperaDTO.getNuEspecialidade() != 0){
		sql =  sql + " and especialidade.id_especialidade = " + relTempoEsperaDTO.getNuEspecialidade().toString();
		}
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNuTerapeuta()) && relTempoEsperaDTO.getNuTerapeuta() != 0){
		sql =  sql + " and terapeuta.id_terapeuta = " + relTempoEsperaDTO.getNuTerapeuta().toString();
		}
		if(!ObjectUtil.isEmpty(relTempoEsperaDTO.getNoPaciente())){
		sql =  sql + " and pessoa.nome = '" + relTempoEsperaDTO.getNoPaciente() + "'";
		}
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
		RelatorioTempoEsperaDTO tempo = new RelatorioTempoEsperaDTO();
		tempo.setNoTerapeuta(rs.getString("nome"));
		tempo.setTempoTotal(rs.getBigDecimal("tempoTotal"));
		tempo.setQuantidade(rs.getBigDecimal("quantidade"));
		lista.add(tempo);
		}
		conn.close();
		return lista;
	}
	
}
